package main

import "fmt"

// 利用select实现
// select 的case都是IO类型
// select 内如果多个case都命中，则会随机执行一个
func main() {
	ch := make(chan int)    // 传递数据
	quit := make(chan bool) // 传递结束信号

	go func() {
		for i := 1; i < 10; i++ {
			fmt.Println(<-ch)
		}
		quit <- true
	}()

	fib(ch, quit)

}

func fib(ch chan<- int, quitChan <-chan bool) {
	x, y := 1, 1
	for {
		select {
		case ch <- x: // 没有地方读ch时，读不到时候回阻塞
			x, y = y, x+y

		case <-quitChan: // 该case会阻塞(这是主协成)
			return
		}
	}
}
